package com.example.laixunlong.tools;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.util.Log;
import android.widget.ImageView;

import androidx.core.content.FileProvider;

import com.example.laixunlong.R;
import com.example.laixunlong.control.ResourceFile_ziyuan;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class ImageInOutPut {
    /*控制类型的常量*/
    public static final int Inapp=0;
    public static final int Internet=1;
    public static final int Infile=2;
    public static final int ROUTE_public=1;
    public static final int ROUTE_app=2;
    public static final int ROUTE_private=3;
    /*网络请求中转变量*/
    public static Activity Activity=null;
    public static InputStream Input=null;
    public static String Src="";
    public static String Path="";
    /*转换后的属性*/
    public Uri URI=null;
    public Bitmap BIT=null;

    /*保存图片 参数结构( 触发窗体, 资源路径, 新的文件名(需要后缀), 文件保存位置, 资源的获取位置 )*/
    public static void saveImage(Activity activity, final String path, String new_filename, int route, int position)
    {
    //获取位图数据,(比特流)
        Bitmap bit_img=null;
        //初始化流文件
        if(position==Inapp)//从应用内部资源文件中获取图片比特流
        {

            bit_img= BitmapFactory.decodeResource(activity.getResources(), R.drawable.yqqs);
        }
        /*重要点!!!=================================================================================*/
        else if(position==Internet)//从网络上获取图片文件资源
        {
            /*三个重要属性通过全局静态实现线程共享,注意按照以下初始化顺序*/
            Activity=activity;
            Src=path;
            Path=writePath(route,new_filename);
            /*
                从android9以后,主线程中不再进行端口发送,需要另外开辟一个线程
            */
            new Thread(){
                @Override
                public void run(){
                    FileOutputStream f=null;
                    try {
                        URL url=new URL(Src);//取地址
                        URLConnection connection=url.openConnection();//发请求
                        Input=connection.getInputStream();//创建文件流
                        Bitmap bit= BitmapFactory.decodeStream(Input);//转为比特流
                        /*写入本地*/
                        f=new FileOutputStream(Path);//建流口
                        bit.compress(Bitmap.CompressFormat.PNG,100,f);//拉入流中

                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }finally {
                        if (f!=null)
                        {
                            try {
                                f.close();
                            } catch (IOException e) {
                                throw new RuntimeException(e);
                            }
                        }
                    }
                }
            }.start();
            /* 完成写入后退出当前方法 */
            return;
        }
        else if(position==Infile)//从本地文件获取比特流
        {
            FileInputStream f=null;
            try {

                f=new FileInputStream(path);//获取文件流
                bit_img=BitmapFactory.decodeStream(f);//转为比特流

            } catch (Exception e) {
                throw new RuntimeException(e);
            }finally {
                if (f!=null)
                {
                    try {
                        f.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        }
        else //都不存在则报错退出
        {
            ;
        }

    //位图数据存放到指定路径中
        FileOutputStream f=null;
        try {
            /*根据需要获取不同目标路径*/
            String pa=writePath(route,new_filename);
            f=new FileOutputStream(pa);//建流口
            bit_img.compress(Bitmap.CompressFormat.PNG,100,f);//拉入流中

        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } finally {
            if (f!=null)
            {
                try {
                    f.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
    /*获取图片*/
    public static void getImage(String path, ImageView image)
    {
        Bitmap bitmap=null;
        FileInputStream fis=null;
        try {
            fis=new FileInputStream(path);
            bitmap=BitmapFactory.decodeStream(fis);

            image.setImageBitmap(bitmap);

        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }finally {
            if (fis!=null)
            {
                try {
                    fis.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
    /*控制写入路径*/
    public static String writePath(int route,String new_filename)
    {
        String pa="";
        if(route==ROUTE_public)//保存到公共路径
        {
            pa=FileInOutPut.getPublicPath(Activity,new_filename);
        }
        else if(route==ROUTE_app)//保存到软件内路径
        {
            pa=FileInOutPut.getAppPath(Activity,new_filename);
        }
        else if(route==ROUTE_private)//保存到私有数据路径
        {
            pa=FileInOutPut.getPrivatePath(Activity,new_filename);
        }
        else
        {
            return null;
        }
        return pa;
    }
    /*重点:通过path获取资源文件 Bitmap 和 Uri*/
    public ImageInOutPut ConvertBitUri(Context context, String path)
    {
        /*
        注意:所有文件的Bitmap都是共享使用的,但资源的Uri是选择性共享的,比如你可以通过file获取其他软件图标,但无法将它发送或删除
        因此在android7.0以后,如果需要对是否有文件的访问权限进行判断
        path一般通过MediaStore访问系统数据库获取,但部分情况下:
                文件可能已经被删除,
                虽然能够获取到路径,但无权访问,
        所以为了避免报错,会对获取的结果进行过滤.
        */
        File file=new File(path);
        /*文件对象必须:存在,是个文件,大小不为0*/
        if(file.exists() && file.isFile() && file.length()>0)
        {
            //1,获取Uri
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)//7.0版本以上,使用FileProvider,
            {
                /*此过程可能报错,因此需要进行包裹*/
                try {
                    URI= FileProvider.getUriForFile(context,context.getString(R.string.file_provider),file);
                }catch (Exception e)
                {
                    e.printStackTrace();
                    URI=null;
                }
            }
            else//7.0版本以下使用Uri.parse
            {
                URI=Uri.parse(path);
            }
            //2,获取Bitmap
            BIT = BitmapFactory.decodeFile(path);//这是获取Bit流的常用方法,基本不会出错,即使是无权访问,也会返回null.
        }
        return this;
    }
}
